#include "itemmanager.h"
#include <QDir>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

ItemManager::ItemManager()
{
    createInitialItemFile();
}

ItemManager::~ItemManager()
{
}

bool ItemManager::createItem(const Item& item)
{
    // 读取现有物品文件
    QJsonArray jsonArray = loadItemFile();

    // 检查条形码是否已存在
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        if (jsonObject["barcode"].toString() == item.barcode) {
            return false; // 条形码已存在
        }
    }

    // 构建物品对象
    QJsonObject itemObject;
    itemObject["barcode"] = item.barcode;
    itemObject["itemName"] = item.itemName;
    itemObject["methodName"] = item.methodName;
    itemObject["creationTime"] = QDateTime::currentDateTime().toString();
    itemObject["createdBy"] = item.createdBy;
    itemObject["lightIntensity"] = item.lightIntensity;
    itemObject["integrationTime"] = item.integrationTime;
    itemObject["integrationCount"] = item.integrationCount;
    QJsonArray displacementArray;
    for (int value : item.displacement) {
        displacementArray.append(value);
    }
    itemObject["displacement"] = displacementArray;

    // 添加新物品
    jsonArray.append(itemObject);

    // 保存物品文件
    saveItemFile(jsonArray);

    return true; // 创建物品成功
}

Item ItemManager::getItem(const QString& barcode)
{
    // 读取现有物品文件
    QJsonArray jsonArray = loadItemFile();

    // 查找物品
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        if (jsonObject["barcode"].toString() == barcode) {
            Item item;
            item.barcode = jsonObject["barcode"].toString();
            item.itemName = jsonObject["itemName"].toString();
            item.methodName = jsonObject["methodName"].toString();
            item.creationTime = QDateTime::fromString(jsonObject["creationTime"].toString());
            item.createdBy = jsonObject["createdBy"].toString();
            item.lightIntensity = jsonObject["lightIntensity"].toInt();
            item.integrationTime = jsonObject["integrationTime"].toInt();
            item.integrationCount = jsonObject["integrationCount"].toInt();
            QJsonArray displacementArray = jsonObject["displacement"].toArray();
            item.displacement.clear();
            for (const QJsonValue& value : displacementArray) {
                item.displacement.append(value.toInt());
            }
            return item;
        }
    }

    // 物品不存在
    Item item;
    item.barcode = "";
    return item;
}

Item ItemManager::getItemByUser(const QString& barcode, const QString& username)
{
    // 读取现有物品文件
    QJsonArray jsonArray = loadItemFile();

    // 查找物品
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        if (jsonObject["barcode"].toString() == barcode && jsonObject["createdBy"].toString() == username) {
            Item item;
            item.barcode = jsonObject["barcode"].toString();
            item.itemName = jsonObject["itemName"].toString();
            item.methodName = jsonObject["methodName"].toString();
            item.creationTime = QDateTime::fromString(jsonObject["creationTime"].toString());
            item.createdBy = jsonObject["createdBy"].toString();
            item.lightIntensity = jsonObject["lightIntensity"].toInt();
            item.integrationTime = jsonObject["integrationTime"].toInt();
            item.integrationCount = jsonObject["integrationCount"].toInt();
            QJsonArray displacementArray = jsonObject["displacement"].toArray();
            item.displacement.clear();
            for (const QJsonValue& value : displacementArray) {
                item.displacement.append(value.toInt());
            }
            return item;
        }
    }

    // 物品不存在
    Item item;
    item.barcode = "";
    return item;
}


QVector<Item> ItemManager::getAllItems()
{
    // 读取现有物品文件
    QJsonArray jsonArray = loadItemFile();

    QVector<Item> allItems;

    // 解析物品数据
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        Item item;
        item.barcode = jsonObject["barcode"].toString();
        item.itemName = jsonObject["itemName"].toString();
        item.methodName = jsonObject["methodName"].toString();
        item.creationTime = QDateTime::fromString(jsonObject["creationTime"].toString());
        item.createdBy = jsonObject["createdBy"].toString();
        item.lightIntensity = jsonObject["lightIntensity"].toInt();
        item.integrationTime = jsonObject["integrationTime"].toInt();
        item.integrationCount = jsonObject["integrationCount"].toInt();
        QJsonArray displacementArray = jsonObject["displacement"].toArray();
        item.displacement.clear();
        for (const QJsonValue& value : displacementArray) {
            item.displacement.append(value.toInt());
        }
        allItems.append(item);
    }

    return allItems;
}

QVector<Item> ItemManager::getAllItemsByUser(const QString& username)
{
    // 读取现有物品文件
    QJsonArray jsonArray = loadItemFile();

    QVector<Item> userItems;

    // 解析物品数据并筛选出属于指定用户的物品
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        QString createdBy = jsonObject["createdBy"].toString();

        if (createdBy == username) {
            Item item;
            item.barcode = jsonObject["barcode"].toString();
            item.itemName = jsonObject["itemName"].toString();
            item.methodName = jsonObject["methodName"].toString();
            item.creationTime = QDateTime::fromString(jsonObject["creationTime"].toString());
            item.createdBy = createdBy;
            item.lightIntensity = jsonObject["lightIntensity"].toInt();
            item.integrationTime = jsonObject["integrationTime"].toInt();
            item.integrationCount = jsonObject["integrationCount"].toInt();
            QJsonArray displacementArray = jsonObject["displacement"].toArray();
            item.displacement.clear();
            for (const QJsonValue& value : displacementArray) {
                item.displacement.append(value.toInt());
            }
            userItems.append(item);
        }
    }

    return userItems;
}

bool ItemManager::deleteItem(const QString& barcode)
{
    // 读取现有物品文件
    QJsonArray jsonArray = loadItemFile();

    // 查找并删除物品
    for (int i = 0; i < jsonArray.size(); ++i) {
        QJsonObject jsonObject = jsonArray[i].toObject();
        if (jsonObject["barcode"].toString() == barcode) {
            jsonArray.removeAt(i);
            // 保存物品文件
            saveItemFile(jsonArray);
            return true; // 删除成功
        }
    }

    return false; // 物品不存在
}

bool ItemManager::deleteItemsByUser(const QString& username)
{
    // 读取现有物品文件
    QJsonArray jsonArray = loadItemFile();

    bool itemsDeleted = false;

    // 查找并删除用户所属的物品
    for (int i = jsonArray.size() - 1; i >= 0; --i) {
        QJsonObject jsonObject = jsonArray[i].toObject();
        if (jsonObject["createdBy"].toString() == username) {
            jsonArray.removeAt(i);
            itemsDeleted = true;
        }
    }

    if (itemsDeleted) {
        // 保存物品文件
        saveItemFile(jsonArray);
    }

    return itemsDeleted;
}

bool ItemManager::checkItemExists(const QString& barcode)
{
    // 读取现有物品文件
    QJsonArray jsonArray = loadItemFile();

    // 检索条形码
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        if (jsonObject["barcode"].toString() == barcode) {
            return true; // 条形码存在
        }
    }

    return false; // 条形码不存在
}

QString ItemManager::getItemFilePath() const
{
    return "./items.json";
}

void ItemManager::createInitialItemFile()
{
    QString filePath = getItemFilePath();

    QFile file(filePath);
    if (!file.exists()) {
        // 创建初始物品文件
        QJsonArray jsonArray;
        saveItemFile(jsonArray);
    }
}

void ItemManager::saveItemFile(const QJsonArray& jsonArray)
{
    QString filePath = getItemFilePath();

    QFile file(filePath);
    if (file.open(QIODevice::WriteOnly)) {
        QJsonDocument jsonDoc(jsonArray);
        file.write(jsonDoc.toJson());
        file.close();
    }
}

QJsonArray ItemManager::loadItemFile() const
{
    QString filePath = getItemFilePath();

    QFile file(filePath);
    if (file.open(QIODevice::ReadOnly)) {
        QByteArray jsonData = file.readAll();
        file.close();
        QJsonDocument jsonDoc(QJsonDocument::fromJson(jsonData));
        return jsonDoc.array();
    }

    return QJsonArray();
}


